package core.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import util.DbUtils;
import core.dao.UsuarioDao;
import core.model.Usuario;

/**
 * @author andoniibarguchilorenzo
 * clase que contiene los metodos implementados de la interface UsuarioDao
 */
public class UsuarioDaoImpl extends GenericDaoImpl<Usuario, Integer> implements
		UsuarioDao {

	@Override
	public void insertUser(Usuario usuario) {
		// TODO Auto-generated method stub

		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			// http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
			ps = connection
					.prepareStatement(
							"INSERT INTO USUARIO(NICK,NOMBRE,APELLIDO1,APELLIDO2,EMAIL,COD_LOCALIDAD,PASSWORD) VALUES (?,?,?,?,?,?,?)",
							PreparedStatement.RETURN_GENERATED_KEYS);
			ps.setString(1, usuario.getNick());
			ps.setString(2, usuario.getNombre());
			ps.setString(3, usuario.getApellido1());
			ps.setString(4, usuario.getApellido2());
			ps.setString(5, usuario.getEmail());
			ps.setInt(6, usuario.getCodigo_provincia());
			ps.setString(7, usuario.getPassword());

			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public Usuario findBy(String nick) {
		// TODO Auto-generated method stub
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Usuario> usuarios = new ArrayList<Usuario>();
		try {
			ps = connection
					.prepareStatement("SELECT NICK, NOMBRE, APELLIDO1, APELLIDO2, EMAIL, COD_LOCALIDAD, PASSWORD FROM USUARIO WHERE NICK = ?");
			ps.setString(1, nick);

			ResultSet rs = ps.executeQuery();
			Usuario usuario = null;

			while (rs.next()) {
				usuario = Usuario.createUsuario(rs.getString(1),
						rs.getString(2), rs.getString(3), rs.getString(4),
						rs.getString(5), rs.getInt(6), rs.getString(7));
				usuarios.add(usuario);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return usuarios.get(0);
	}

	public void deleteUser(String nick) {
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			// http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
			ps = connection
					.prepareStatement("DELETE FROM USUARIO WHERE NICK = ?");
			ps.setString(1, nick);

			ps.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public HashMap<String, String> getPasswords() {
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		HashMap<String, String> passwords = new HashMap<String, String>();
		try {
			ps = connection
					.prepareStatement("SELECT NICK, PASSWORD FROM USUARIO");

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				passwords.put(rs.getString(1), rs.getString(2));

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return passwords;
	}

	@Override
	public void ModifyUsuario(Usuario user) {
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			ps = connection
					.prepareStatement("UPDATE USUARIO SET NICK = ?, NOMBRE = ?, APELLIDO1 = ?, APELLIDO2 = ?, EMAIL = ?, COD_LOCALIDAD = ?, PASSWORD = ? WHERE NICK = ?");
			ps.setString(1, user.getNick());
			ps.setString(2, user.getNombre());
			ps.setString(3, user.getApellido1());
			ps.setString(4, user.getApellido2());
			ps.setString(5, user.getEmail());
			ps.setInt(6, user.getCodigo_provincia());
			ps.setString(7, user.getPassword());
			ps.setString(8, user.getNick());
			ps.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}

}
